package net.zjitc.list;



public class MyArrayList<T> implements MyList<T> {
    private Object[] arr = new Object[10];
    private int size = 0;

    @Override
    public boolean add(T data) { //添加到最后，不存在越界
        //在向数组中添加元素的时候，添加的位置怎么确定？
        // 能不能通过判断是否为null来确定添加的位置？

       /* for (int i = 0; i < arr.length; i++) {
            if (arr[i] == null){
                arr[i]= data;
                break;
            }
        }
*/
        //先判断数组是否够用，不够用的话扩容
        capacity();
        //添加元素
        arr[size] = data;
        size++;
        return true;
    }



    /**
     *
     * @param index
     * @param data
     * @return
     */
    @Override
    public boolean add(int index, T data) {
        //先判断是否越界
        if (index<0 || index >size){
            throw new RuntimeException("MyArrayList数组越界");
        }
        //是否扩容？
        capacity();

        //如何插入？

        for (int i = size; i >index ; i--) {
            arr[i] = arr[i-1];
        }
        arr[index] = data;
        size++;
        return true;

    }

    @Override
    public T remove(T data) {

        T oldData= null ;
        for (int i = 0; i < size; i++) {
            if (arr[i].equals(data) ||arr[i] == data){
                oldData = (T) arr[i];

                for (int j = i; j < size-1; j++) {
                    arr[i] = arr[i+1];
                }
                arr[size]=null;
                size--;
            }
        }

        return oldData;
    }

    @Override
    public T remove(int index) {

        return null;
    }

    @Override
    public boolean set(int index, T data) {
        if (index<0 || index>size){
            throw new RuntimeException("......");
        }
        arr[index] = data;
        return true;
    }
    
    @Override
    public T getValue(int index) {
        if (index<0 || index>size){
            throw new RuntimeException("......");
        }

        return (T) arr[index];
    }

    @Override
    public int size() {
        return size;
    }


    /**
     * 扩容
     */
    private void capacity() {
        if (size >= arr.length) {
            Object[] temp = new Object[size * 2];
            //将原数组的值拷贝到新的数组中
            for (int i = 0; i < size; i++) {
                temp[i] = arr[i];
            }
            //使用新数组
            arr = temp;
        }
    }
}
